// 版权所有2021 Go作者。版权所有。
// 此源代码的使用受BSD样式的约束
// 可以在许可证文件中找到的许可证。

// 开始：建造！类型参数
// +建造！类型参数

package types

import "go/ast"

// Info保存已检查类型的包的结果类型信息。
// 仅收集为其提供地图的信息。
// 如果包有类型错误，则收集的信息可能会丢失
// 不完整。
type Info struct {
	// 类型将表达式映射到其类型，对于常量
	// 表达式，以及它们的值。无效表达式无效
	// 省略。
	// None
	// 用于（可能带括号）表示内置的标识符
	// 功能，记录的签名是呼叫站点特定的：
	// 如果调用结果不是常量，则记录的类型为
	// 参数特定的签名。否则，记录的类型
	// 这是无效的。
	// None
	// 类型映射不会记录每个标识符的类型，
	// 仅显示在任意表达式所在的位置
	// 被允许例如，选择器中的标识符f
	// 表达式x.f仅在选择映射中找到
	// 在变量声明“var z int”中找到标识符z
	// 仅在Defs映射中，以及在
	// 在Uses映射中收集合格标识符。
	Types map[ast.Expr]TypeAndValue

	// Defs将标识符映射到它们定义的对象（包括
	// 程序包名称、点导入的点“.”和空白的“u”标识符）。
	// 对于不表示对象的标识符（例如，包名称
	// 在包子句中，或在t中的符号变量t:=x（类型）
	// 类型开关头），相应的对象为nil。
	// None
	// 对于嵌入式字段，Defs返回它定义的字段*Var。
	// None
	// 不变量：Defs[id]==nil | | Defs[id].Pos（）==id.Pos（）
	Defs map[*ast.Ident]Object

	// 使用将标识符映射到它们所表示的对象。
	// None
	// 对于嵌入式字段，Uses返回它所表示的*TypeName。
	// None
	// 不变量：使用[id]。Pos（）！=id.Pos（）
	Uses map[*ast.Ident]Object

	// 隐式将节点映射到其隐式声明的对象（如果有）。
	// 可能会出现以下节点和对象类型：
	// None
	// 节点声明对象
	// None
	// *ast.ImportSpec*PkgName用于不带重命名的导入
	// *ast.CASECLASSION类型特定*每个类型开关case子句的Var（包括默认值）
	// *ast.Field匿名参数*Var（包括未命名的结果）
	// None
	Implicits map[ast.Node]Object

	// 选择映射选择器表达式（不包括限定标识符）
	// 到相应的选择。
	Selections map[*ast.SelectorExpr]*Selection

	// 作用域将ast.节点映射到它们定义的作用域。包作用域不可用
	// 与特定节点关联，但与属于包的所有文件关联。
	// 因此，包范围可以在类型检查包对象中找到。
	// 作用域嵌套，宇宙作用域是最外层的作用域，包含
	// 包含（一个或多个）文件作用域的包作用域
	// 函数作用域，它依次包含语句和函数文字作用域。
	// 请注意，即使在包中声明了包级函数
	// 作用域，函数作用域嵌入到文件的文件作用域中
	// 包含函数声明的。
	// None
	// 以下节点类型可能出现在作用域中：
	// None
	// *ast.File
	// *ast.FuncType
	// *ast.BlockStmt
	// *ast.IfStmt
	// *ast.STMT
	// *ast.TypeSwitchStmt
	// *case从句
	// *ast.COMM子句
	// *ast.ForStmt
	// *ast.RANGESMT
	// None
	Scopes map[ast.Node]*Scope

	// InitOrder是包级初始值设定项的列表，其顺序如下：
	// 他们必须被处决。初始值设定项引用与
	// 初始化依赖项按拓扑顺序显示，其他依赖项按拓扑顺序显示
	// 按源顺序。没有初始化表达式的变量不可用
	// 显示在此列表中。
	InitOrder []*Initializer
}

func getInferred(info *Info) map[ast.Expr]_Inferred {
	return nil
}
